package com.xm;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author：xm
 * @Project：runoob
 * @Date：2024/7/15 21:03
 */

public class Generic063 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        List<Integer> integers = new ArrayList<>();
        List<Number> numbers = new ArrayList<>();
        List<Object> obj = new ArrayList<>();

        strings.add("xm");
        integers.add(28);
        numbers.add(369);
        obj.add("测试");

        getData(strings);
        getData(integers);
        getData(numbers);
        getData(obj);

        System.out.println("---华丽的分割线---");

        // 编译报错，因为 getNumber() 方法中的参数已经限定了参数泛型上限为 Number，因泛型 String 不在这个范围之内，所以会报错。
        // getNumber(strings);
        getNumber(integers);
        getNumber(numbers);

        // 类型通配符下限通过形如 List<? super Number> 来定义，表示类型只能接受 Number 及其上层父类类型，如 Object 类型的实例。
        // getUperNumber(strings);
        // getUperNumber(integers);
        getUperNumber(numbers);
        getUperNumber(obj);


    }

    // 未限定通配符 ？
    public static void getData(List<?> data) {
        System.out.println("data:"+data.get(0));
    }

    // 上限通配符（取数据） ? extends Number
    public static void getNumber(List<? extends Number> data) {
        System.out.println("data:"+data.get(0));
    }

    // 类型通配符下限通过形如 ? super Number 来定义，表示类型只能接受 Number 及其上层父类类型，如 Object 类型的实例。
    public static void getUperNumber(List<? super Number> data) {
        System.out.println("data:"+data.get(0));
    }
}
